// 更完整且可维护的 preload 实现
// 使用 contextBridge 安全地将受限 API 暴露给渲染进程
const { contextBridge, ipcRenderer } = require('electron');

console.log('preload: loaded');

// 允许的 IPC 通道列表（白名单）
const safeInvokeChannels = ['list-serial-ports', 'open-serial-port', 'close-serial-port', 'send-data'];

// 暴露给渲染进程的 API
const electronAPI = {
  hello: () => 'hello_from_preload',
  testElectronAPI: () => 'Electron API is working!',

  // 主动调用并等待主进程返回（基于 ipcRenderer.invoke）
  invoke: async (channel, ...args) => {
    if (!safeInvokeChannels.includes(channel)) {
      throw new Error('不允许的通道: ' + channel);
    }
    return await ipcRenderer.invoke(channel, ...args);
  },

  // 便捷串口方法
  listSerialPorts: async () => {
    try {
      return await ipcRenderer.invoke('list-serial-ports');
    } catch (err) {
      console.error('listSerialPorts error', err);
      return [];
    }
  },

  openSerialPort: async (portPath, baudRate) => {
    return await ipcRenderer.invoke('open-serial-port', { port: portPath, baudRate });
  },

  closeSerialPort: async () => {
    return await ipcRenderer.invoke('close-serial-port');
  },

  sendData: async (data) => {
    return await ipcRenderer.invoke('send-data', { data });
  },

  // 注册串口数据回调（通过 ipcRenderer.on 转发）
  onSerialData: (callback) => {
    // 仅在传入函数时注册
    if (typeof callback !== 'function') return;
    const handler = (_event, data) => callback(data);
    ipcRenderer.on('serial-data', handler);
    // 返回一个取消订阅的函数
    return () => ipcRenderer.removeListener('serial-data', handler);
  }
};

contextBridge.exposeInMainWorld('electronAPI', electronAPI);